home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
vol_200
/
286_01
/
equiv.c
< prev
next >
Wrap
Text File
|
1989-05-23
|
5KB
|
278 lines
#include <stdio.h>
#include <dos.h>
#include <gds.h>
/*
int far *calcaddr(x,y)
int x,y;
{
long tloc;
int temp;
tloc = (y & 0x01) ? 0xba000000L : 0xb8000000L;
temp = y >> 1;
tloc += (temp << 4) + (temp << 6) + ((x >> 3) & 0xfffe);
return ( (int far *) tloc );
}
set_text()
{
union REGS inregs;
union REGS outregs;
inregs.h.al = 2;
inregs.h.ah = 0;
int86(0x10,&inregs,&outregs);
}
set_graph()
{
union REGS inregs;
union REGS outregs;
inregs.h.al = 6;
inregs.h.ah = 0;
int86(0x10,&inregs,&outregs);
}
*/
dot(x,y)
int x,y;
{
int far *addr;
addr=calcaddr(x,y);
fr_write(addr,DOTVALUE[x & 0x0f]);
}
vertline(x,y,length)
int x,y,length;
{
int far *addr, far *downline();
unsigned int pword;
int loop;
addr=calcaddr(x,y);
LASTY=y;
pword=DOTVALUE[x & 0x0f];
while (length-- > 0) {
fr_write(addr,pword);
addr=downline(addr);
}
}
horzline(x,y,length)
int x,y,length;
{
int far *addr;
unsigned int pword;
int len,loop;
addr=calcaddr(x,y);
len = (x & 0x0f) + length;
if (len <= 16) {
pword=LEFTWORD[x & 0x0f] ^ LEFTWORD[len];
fr_write(addr,pword);
return;
}
fr_write(addr,LEFTWORD[x & 0x0f]);
addr++;
for (loop=len >> 4; loop > 1; loop--,addr++)
fr_write(addr,0xffff);
fr_write(addr,RIGHTWORD[len & 0x0f]);
}
circle_pt(ctrx,ctry,x,y)
int ctrx,ctry,x,y;
{
dot(x+ctrx,y+ctry);
dot(y+ctrx,x+ctry);
dot(y+ctrx,-x+ctry);
dot(x+ctrx,-y+ctry);
dot(-x+ctrx,-y+ctry);
dot(-y+ctrx,-x+ctry);
dot(-y+ctrx,x+ctry);
dot(-x+ctrx,y+ctry);
}
circle(centerx,centery,radius)
int centerx,centery,radius;
{
int x,y,d, incr1, incr2;
x=0;
y=radius;
incr1=6;
incr2=10-(radius<<2);
d=3-(radius<<1);
while (x < y) {
circle_pt(centerx,centery,x++,y);
if (d<0) {
d+=incr1;
incr2+=4;
} else {
d+=incr2;
incr2+=8;
y--;
}
incr1+=4;
}
if (x==y) circle_pt(centerx,centery,x,y);
}
ellipse_pt(ctrx,ctry,x,y)
int ctrx,ctry,x,y;
{
dot(x+ctrx,y+ctry);
dot(x+ctrx,-y+ctry);
dot(-x+ctrx,-y+ctry);
dot(-x+ctrx,y+ctry);
}
ellipse(ctrx,ctry,a,b)
int ctrx,ctry,a,b;
{
long incr1,incr2,a2,b2,d,step1,step2,ptx,pty;
int x,y;
x=0;
y=b;
a2= (long) a * a;
b2= (long) b * b;
step1 = a2 << 2;
step2 = b2 << 2;
d= ((b2 - (a2 * b)) << 1) + a2;
incr1= step2 + (b2 << 1);
incr2= step1 + step2 + (b2 << 1) - ((a2 * b) << 2);
ptx=0;
pty=a2 * y;
while (ptx < pty) {
ellipse_pt(ctrx,ctry,x++,y);
if (d<0)
d+=incr1;
else {
d+=incr2;
incr2+=step1;
y--;
pty-=a2;
}
ptx+=b2;
incr1+=step2;
incr2+=step2;
}
if (ptx == pty) ellipse_pt(ctrx,ctry,x,y);
y=0;
x=a;
d= ((a2 - (b2 * a)) << 1) + b2;
incr1= step1 + (a2 << 1);
incr2= step2 + step1 + (a2 << 1) - ((b2 * a) << 2);
pty=0;
ptx=b2 * x;
while (pty < ptx) {
ellipse_pt(ctrx,ctry,x,y++);
if (d<0)
d+=incr1;
else {
d+=incr2;
incr2+=step2;
x--;
ptx-=b2;
}
pty+=a2;
incr1+=step1;
incr2+=step1;
}
if (ptx==pty) ellipse_pt(ctrx,ctry,x,y);
}
line(x1,y1,x2,y2)
int x1,y1,x2,y2;
{
int dx,dy,d,x,y,xend,yend,len,incr1,incr2,xdir,ydir,dir;
xdir=ydir=0;
if ((dx=x2-x1) < 0) { dx = -dx; xdir=(-1); }
if ((dy=y2-y1) < 0) { dy = -dy; ydir=(-1); }
if (dx == 0) {
if (xdir)
vertline(x1,y2,++dy);
else
vertline(x1,y1,++dy);
}
if (dy == 0) {
if (ydir)
horzline(x1,y2,++dx);
else
horzline(x1,y1,++dx);
}
if ((xdir==(-1)) && (ydir==(-1)))
dir=1;
else if (xdir || ydir)
dir=xdir+ydir;
else
dir=1;
if (dy <= dx) {
d = (dy << 1) - dx;
incr1 = dy << 1;
incr2 = (dy - dx) << 1;
if (xdir) {
x=x2; y=y2; xend=x1;
}
else {
x=x1; y=y1; xend=x2;
}
len=1;
while (x++<xend) {
if (d<0) {
d+=incr1;
len++;
}
else {
horzline(x-len,y,len);
len=1;
d+=incr2;
y+=dir;
}
}
horzline(x-len,y,len);
}
else {
d = (dx << 1) - dy;
incr1 = dx << 1;
incr2 = (dx - dy) << 1;
if (ydir) {
x=x2; y=y2; yend=y1;
}
else {
x=x1; y=y1; yend=y2;
}
len=1;
while (y++<yend) {
if (d<0) {
d+=incr1;
len++;
}
else {
vertline(x,y-len,len);
len=1;
d+=incr2;
x+=dir;
}
}
vertline(x,y-len,len);
}
}
main()
{
setgraph();
horzline(0,0,640);
vertline(0,0,200);
line(0,0,639,199);
circle(320,100,90);
ellipse(320,100,300,95);
getch();
settext();
}